package cn.itsource.hrm.service.impl;

import cn.itsource.hrm.domain.CourseType;
import cn.itsource.hrm.mapper.CourseTypeMapper;
import cn.itsource.hrm.service.ICourseTypeService;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author ${author}
 * @since 2020-12-17
 */
@Service
@Slf4j
@CacheConfig(cacheNames="CourseTypeServiceImpl.getTreeData")
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    private static final String COURSE_TYPE_TREE_DATA = "CourseTypeServiceImpl.getTreeData";

    @Autowired
    private RedisTemplate<String, String> redisTemplate;


    @Override
    @CacheEvict(key = "'ALL'")
    public boolean insert(CourseType entity) {
        //redisTemplate.delete(COURSE_TYPE_TREE_DATA);
        return super.insert(entity);
    }

    @Override
    @Cacheable(key = "'ALL'")
    public List<CourseType> getTreeData() {
        log.info("CourseTypeServiceImpl: " + "查询数据库 =======================");
        return getTreeDataB();
    }

//    @Override
//    public List<CourseType> getTreeData() {
//        // 1.查询缓存中是否有数据
//        String data = redisTemplate.opsForValue().get(COURSE_TYPE_TREE_DATA);
//        // 2.如果有直接返回
//        if (StringUtils.hasLength(data)) {
//            return JSON.parseArray(data, CourseType.class);
//        }
//        // 3.如果没有，则查询数据库
//        log.info("CourseTypeServiceImpl: " + "查询数据库 =======================");
//        List<CourseType> list = getTreeDataB();
//        // 4.数据库查询的结果放到缓存中;
//        redisTemplate.boundValueOps(COURSE_TYPE_TREE_DATA).set(JSON.toJSONString(list));
//        return list;
//    }

    public List<CourseType> getTreeDataA() {
        //思路分析：
        // 方案一：查是可以查，但是效率低；
        // 1.先查询所有的一级分类
        // 2.在根据一级分类查它下面的二级分类
        // 3.递归查询 直到没有下级分类 ;
        return baseMapper.getTreeDataByPid(0L);
    }

    public List<CourseType> getTreeDataB() {
        //思路分析：
        // 方案二：直接在Java内存中处理逻辑操作，两次遍历查询出所有关系；
        // 先查询出所有的分类
        // 直接遍历所有分类，在找到他自己的上级分类;
        List<CourseType> all = baseMapper.selectAllList();
        ArrayList<CourseType> first = new ArrayList<>(); //有四个
        //保存所有的分类在一个Map中，就可以直接通过Map的key获取上级；
        Map<Long, CourseType> tempmap = new HashMap();
        all.forEach(a -> {
            tempmap.put(a.getId(), a);
        });

        all.forEach(e -> {
            if (e.getPid().equals(0L)) {
                //添加所有的第一层分类；
                first.add(e);
            } else {
                //二层或三层分类自己找自己的上级;
                tempmap.get(e.getPid()).getChildren().add(e);
//                for (CourseType type : all) {
//                    if (type.getPid().equals(e.getPid())) {
//                        type.getChildren().add(e);
//                        break;
//                    }
//                }
            }
        });
        return first;
    }



}
